// Monad(单子);
// 在使用IO函子的时候, 如果我们写出如下代码;

//读取文件
const fs = require("fs");
const fp = require("lodash/fp");

//IO函子的问题

class IO {
  static of(value) {
    return new IO(function () {
      return value;
    });
  }
  constructor(fn) {
    this._value = fn;
  }
  map(fn) {
    return new IO(fp.flowRight(fn, this._value));
  }
}

let readFile = function (filename) {
  return new IO(function () {
    return fs.readFileSync(filename, "utf-8");
  });
};
let print = function (x) {
  return new IO(function () {
    console.log(x);
    return x;
  });
};

let cat = fp.flowRight(print, readFile);
console.log(cat); //[Function]

// 需要提供r._value()._value()获取值;
let r = cat("package.json");
console.log(r); // IO {_value:[Function]
console.log(r._value());
console.log(r._value()._value()); //获取文件
